package handlers

import (
	"data_service/models"
	"data_service/server"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

// 初始化积分业务服务
var pointsService = server.NewPointsService()

// DailyCheckIn 用户每日签到
func DailyCheckIn(c *gin.Context) {
	// 从上下文中获取用户信息
	userInterface, exists := c.Get("user")
	if !exists {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户未登录"})
		return
	}

	// 类型断言获取用户对象
	user, ok := userInterface.(models.User)
	if !ok {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户信息无效"})
		return
	}

	// 获取用户ID
	userID := int(user.ID)

	// 执行签到逻辑
	result, err := pointsService.DailyCheckIn(userID)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, result)
}

// AddPointsForPost 发布动态奖励积分
func AddPointsForPost(c *gin.Context) {
	// 从上下文中获取用户信息
	userInterface, exists := c.Get("user")
	if !exists {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户未登录"})
		return
	}

	// 类型断言获取用户对象
	user, ok := userInterface.(models.User)
	if !ok {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户信息无效"})
		return
	}

	// 获取用户ID
	userID := int(user.ID)

	// 执行发布动态奖励积分逻辑
	result, err := pointsService.AddPointsForPost(userID)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, result)
}

// GetPointsHistory 获取积分历史记录
func GetPointsHistory(c *gin.Context) {
	// 从上下文中获取用户信息
	userInterface, exists := c.Get("user")
	if !exists {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户未登录"})
		return
	}

	// 类型断言获取用户对象
	user, ok := userInterface.(models.User)
	if !ok {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户信息无效"})
		return
	}

	// 获取用户ID
	userID := int(user.ID)

	// 获取积分历史记录
	result, err := pointsService.GetPointsHistory(userID)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, result)
}

// GetPointsRanking 获取积分排行榜
func GetPointsRanking(c *gin.Context) {
	// 获取积分排行榜
	result, err := pointsService.GetPointsRanking()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, result)
}

// UpdateUserLastLogin 更新用户最后登录时间
func UpdateUserLastLogin(userID int) error {
	return models.GetDB().Model(&models.User{}).Where("id = ?", userID).Update("last_login", time.Now()).Error
}
